1. 调整堆的大小1.1. 随着堆的大小增加,停顿的持续时间也会增加1.2. 停顿发生的频率确实会降低,但是停顿的持续时间会拖慢整体性能1.3. 操作系统进行的交换对JVM是不公开的1.3.1. 操作系统要将数据从磁盘交换到RAM,这是一个代价高昂的操作1.4. 首要规则是设定堆的大小永远不要超过机器的物理内存1.4.1. 如果有多个JVM在运行,那么这适用于所有堆的总和1.5. -XmsN标志1.5.1. 初始值1.6. -XmxN标志1.6.1. 最大值1.7. 默认值1.7.2. 在物理内存小于192MB的机器上,堆的最大值会是物理内存的一半(96MB或更少)1.8. 如果JVM发现堆在
1. 元空间(metaspace)1.1. 当JVM加载类时,它必须记录这些类的某些元数据,这些数据占据的一个单独的堆空间,即元空间1.2. 元空间里的信息只在编译器和JVM运行时使用,它所保存的数据被称为类元数据(classmetadata)1.2.1. 对于终端用户,元空间是不透明的1.2.2. 元空间并不保存类的实例或者反射对象1.3. 通过永久代(permgen)的实现来处理的1.4. 元空间的大小与它所使用的类的数量成正比1.5. -XX:MetaspaceSize=N1.5.1. 初始大小1.6. -XX:MaxMetaspaceSize=N1.6.1. 最大值1.7. 元空间大小
1. 元空间(metaspace)1.1. 当JVM加载类时,它必须记录这些类的某些元数据,这些数据占据的一个单独的堆空间,即元空间1.2. 元空间里的信息只在编译器和JVM运行时使用,它所保存的数据被称为类元数据(classmetadata)1.2.1. 对于终端用户,元空间是不透明的1.2.2. 元空间并不保存类的实例或者反射对象1.3. 通过永久代(permgen)的实现来处理的1.4. 元空间的大小与它所使用的类的数量成正比1.5. -XX:MetaspaceSize=N1.5.1. 初始大小1.6. -XX:MaxMetaspaceSize=N1.6.1. 最大值1.7. 元空间大小
1. 回收1.1. 找到不使用的对象1.2. 释放它们的内存1.3. 压缩堆1.4. 合在一起称为回收2. Throughput回收器2.1. 工作细节比较简单2.1.1. 可以在同一个GC周期内完成回收2.1.2. 在单次操作过程中回收新生代或老年代2.2. MinorGC2.2.1. 当Eden空间被填满时,新生代回收就会发生2.2.2. 新生代回收会将所有的对象移出Eden空间2.2.2.1. Eden空间一般是空的2.2.2.2. 不认为它被压缩了2.2.3. 另一些被移到老年代2.2.4. 还有大量对象因不再使用而被丢弃2.3. FullGC2.3.1. 老年代回收会将新生代中的所有
1. 回收1.1. 找到不使用的对象1.2. 释放它们的内存1.3. 压缩堆1.4. 合在一起称为回收2. Throughput回收器2.1. 工作细节比较简单2.1.1. 可以在同一个GC周期内完成回收2.1.2. 在单次操作过程中回收新生代或老年代2.2. MinorGC2.2.1. 当Eden空间被填满时,新生代回收就会发生2.2.2. 新生代回收会将所有的对象移出Eden空间2.2.2.1. Eden空间一般是空的2.2.2.2. 不认为它被压缩了2.2.3. 另一些被移到老年代2.2.4. 还有大量对象因不再使用而被丢弃2.3. FullGC2.3.1. 老年代回收会将新生代中的所有
1. G1垃圾回收器1.1. 垃圾优先(garbagefirst)1.2. 在堆内离散的区域上进行操作1.2.1. 默认大约有2048个1.2.2. 代的区域不需要是连续的1.2.3. 可能属于老年代1.2.3.1. 并发后台线程寻找没有被引用的对象时,一些区域会比其他区域有更多的垃圾1.2.4. 可能属于新生代1.3. 并发回收器(concurrentcollector)1.3.1. 标记老年代中不使用的对象和应用程序线程同时发生(它们同时运行)1.3.2. 并不是完全并发的1.3.2.1. 新生代的标记和压缩仍需要暂停所有应用程序线程1.3.2.2. 老年代的压缩也是在应用程序线程暂停期间
1. G1垃圾回收器1.1. 垃圾优先(garbagefirst)1.2. 在堆内离散的区域上进行操作1.2.1. 默认大约有2048个1.2.2. 代的区域不需要是连续的1.2.3. 可能属于老年代1.2.3.1. 并发后台线程寻找没有被引用的对象时,一些区域会比其他区域有更多的垃圾1.2.4. 可能属于新生代1.3. 并发回收器(concurrentcollector)1.3.1. 标记老年代中不使用的对象和应用程序线程同时发生(它们同时运行)1.3.2. 并不是完全并发的1.3.2.1. 新生代的标记和压缩仍需要暂停所有应用程序线程1.3.2.2. 老年代的压缩也是在应用程序线程暂停期间
1. 巨型对象1.1. humongousobject1.2. 大于等于区域一半大小的对象1.3. 巨型对象被直接分配在老年代,所以它在新生代回收期间不会被释放1.4. G1区域的大小是2的幂,最小值是1MB1.5. 如果堆的最大值和初始值差别很大,就会有过多的G1区域,这种情况下应该增加G1区域的大小1.6. -XX:G1HeapRegionSize=N1.6.1. G1的区域大小1.6.2. 默认值名义上是02. 完全掌控堆的大小2.1. 堆的默认值取决于机器的内存量2.1.1. XX:MaxRAM=N标志2.2. 堆的最大值是MaxRAM的四分之一2.3. 将32位Windows服务器的
1. 巨型对象1.1. humongousobject1.2. 大于等于区域一半大小的对象1.3. 巨型对象被直接分配在老年代,所以它在新生代回收期间不会被释放1.4. G1区域的大小是2的幂,最小值是1MB1.5. 如果堆的最大值和初始值差别很大,就会有过多的G1区域,这种情况下应该增加G1区域的大小1.6. -XX:G1HeapRegionSize=N1.6.1. G1的区域大小1.6.2. 默认值名义上是02. 完全掌控堆的大小2.1. 堆的默认值取决于机器的内存量2.1.1. XX:MaxRAM=N标志2.2. 堆的最大值是MaxRAM的四分之一2.3. 将32位Windows服务器的
1. Survivor空间1.1. 新生代被划分为两个Survivor空间和一个Eden空间的原因1.1.1. 刚刚被创建并且还在使用中,所以不能被回收,但它们的寿命并没有长到足以进入老年代1.1.2. 仍在新生代中的对象有额外的机会被回收,而不是晋升到(并填满)老年代1.2. 首次新生代回收期间,对象从Eden空间移动到Survivor空间01.3. 下次回收时,活跃对象会从Survivor空间0和Eden空间移动到Survivor空间11.3.1. 此时Eden空间和Survivor空间0完全是空的1.4. 被移入老年代场景1.4.1. Survivor空间非常小,当目标Survivor空